// 箭头函数

// 一、定义函数的几种方式

// 1、方式一

console.log(sum1(1, 2));

function sum1(x, y) {
    return x + y;
}

// 2、方式二

// console.log(sum2(1, 2)); // Uncaught TypeError: sum2 is not a function

let sum2 = function(x, y) {
    return x + y;
}

console.log(sum2(1, 2));

// 3、方式三：箭头函数

let sum3 = (x, y) => {
    return x + y;
}

console.log(sum3(1, 2));

// 当箭头函数没有参数或多个参数，必须用 () 括起来

// 不使用箭头函数
let x1 = function() {
    return 1;
}

// 使用箭头函数
let x2 = () => {
    return 1;
}

// 当箭头函数的函数体只有一行语句，并且需要返回结果时，可以省略 {} 和 return

let sum4 = (x, y) => x + y;

console.log(sum4(1, 2));

// 当箭头函数的函数体有多行语句，必须用 {} 包裹起来，表示代码块。

let sum5 = (x, y) => {
    let result = x + y;
    return result;
}

// 随堂作业

let y1 = function(y) {
    return y;
}

let y = y => y;

let z1 = function() {
    let sum = 0;
    for(let i = 1; i <= 3; i++) {
        sum += i;
    }
    return sum;
}

let z2 = () => {
    let sum = 0;
    for(let i = 1; i <= 3; i++) {
        sum += i;
    }
    return sum;
}


// 二、this 的本质

// 1、全局函数的this指向全局对象window；

function test() {
    console.log(this); // this 指向 Window 对象
}

test();

// 2、当函数作为对象的方法被调用时，this 指向该对象。即谁调用函数this就指向谁；

let arr = [1, 2];
arr.say = function() {
    console.log(this); // this 指向 arr 对象
};

arr.say(); 

let user = {
    name: 'jayjun',
    age: 18,
    say: function() {
        console.log(this); // this 指向 user 对象
    }
}

user.say();

// 3、匿名函数的this指向全局对象window；

/*
let user2 = {
    name: 'jayjun',
    age: 18,
    say: function() {
        setInterval(function() {
            console.log(this); // this 指向 Window 对象
        }, 1000);
    }
}

user2.say();
*/


// 4、箭头函数的this指向的是定义时的this对象，而不是执行时的this对象。

// 问题：如何获取 user3 对象的 name ?

// 方法一：不使用箭头函数，通过闭包方式实现

/*
let user3 = {
    name: 'jayjun',
    age: 18,
    say: function() {
        // console.log(this); // 指向 user3 对象
        let _this = this; // 定义一个_this变量保存this
        setInterval(function() {
            console.log(_this.name, _this.age); // jayjun 18
        }, 1000);
    }
}

user3.say();
*/


// 方法二：使用箭头函数
/*
let user4 = {
    name: "jayjun",
    age: 18,
    say: function() {
        console.log(this); // this 指向 user4 对象
        setInterval(() => {
            console.log(this); // this 指向 user4 对象
        }, 1000);
    }
}

user4.say();
*/

// 箭头函数虽然好用，但是不能滥用！下面是一个滥用箭头函数的例子，是一个错误的示范。

let user5 = {
    name: "jaychou",
    age: 40,
    say: () => {
        console.log(this.name);
    }
}

user5.say();